#include <stdio.h>
#include "tcp.h"
#include "timeWheel.h"

int checkAndClean(int epollFd,int timeWheelIdx,timeWheel_t *pTimeWheel){

    printf("timeWheelIdx=%d\n",timeWheelIdx);
    printf("该集合中共有%d元素\n",pTimeWheel[timeWheelIdx].lastReadySet.curIdx-1);
    for(int m=1;m<pTimeWheel[timeWheelIdx].lastReadySet.curIdx;++m){
        // 将集合中【1】为0的连接全部踢出
        if(pTimeWheel[timeWheelIdx].lastReadySet.arry[m][0]){
            if(pTimeWheel[timeWheelIdx].lastReadySet.arry[m][1]==0){
                printf("超时踢出fd=%d\n",pTimeWheel[timeWheelIdx].lastReadySet.arry[m][0]);
                epollDel(epollFd,pTimeWheel[timeWheelIdx].lastReadySet.arry[m][0]);
                close(pTimeWheel[timeWheelIdx].lastReadySet.arry[m][0]);
                pTimeWheel[timeWheelIdx].lastReadySet.arry[m][0]=0;
            }
        }
    }
    return 0;
}

int addToTimeWheel(timeWheel_t *timeWheel,int *isDel,int idx,int netFd,int hash[][2]){
    
    if(*isDel==0||*isDel==-1){
        // 集合中没有要删除的元素
        int arrIdx=timeWheel[idx].lastReadySet.curIdx;
        while(timeWheel[idx].lastReadySet.arry[arrIdx][0]){
            ++arrIdx;
        }
        timeWheel[idx].lastReadySet.arry[arrIdx][0]=netFd;
        // 更新上次出现位置
        int lastTimeIdx=hash[netFd][0];
        int lastSetIdx=hash[netFd][1];
        if(lastSetIdx!=0){
            if(timeWheel[lastTimeIdx].lastReadySet.arry[0][0]==0){
                // 该元素为第一个要覆盖的元素
                timeWheel[lastTimeIdx].lastReadySet.arry[0][0]=lastSetIdx;
                timeWheel[lastTimeIdx].lastReadySet.arry[0][1]=lastSetIdx;
                timeWheel[lastTimeIdx].lastReadySet.arry[lastSetIdx][1]=-1;
            }
            // 读取最后一个要覆盖的元素下标，将其下标改为自己下标，自己下标改为-1
            else{
                int preDelIdx=timeWheel[lastTimeIdx].lastReadySet.arry[0][1];
                timeWheel[lastTimeIdx].lastReadySet.arry[preDelIdx][1]=lastSetIdx;
                timeWheel[lastTimeIdx].lastReadySet.arry[lastSetIdx][1]=-1;
            }}
        // 更新哈希表
        hash[netFd][0]=idx;
        hash[netFd][1]=arrIdx;
        timeWheel[idx].lastReadySet.curIdx=arrIdx+1;
    }
    else{
        // 集合中有要删除的元素，将下标中【0】更新，【1】更新
        timeWheel[idx].lastReadySet.arry[*isDel][0]=netFd;
        int nextDel=timeWheel[idx].lastReadySet.arry[*isDel][1];
        timeWheel[idx].lastReadySet.arry[*isDel][1]=0;
        // 更新上次出现位置
        int lastTimeIdx=hash[netFd][0];
        int lastSetIdx=hash[netFd][1];
        if(lastSetIdx!=0){
            if(timeWheel[lastTimeIdx].lastReadySet.arry[0][0]==0){
                // 该元素为第一个要覆盖的元素
                timeWheel[lastTimeIdx].lastReadySet.arry[0][0]=lastSetIdx;
                timeWheel[lastTimeIdx].lastReadySet.arry[0][1]=lastSetIdx;
                timeWheel[lastTimeIdx].lastReadySet.arry[lastSetIdx][1]=-1;
            }
            // 读取最后一个要覆盖的元素下标，将其下标改为自己下标，自己下标改为-1
            else{
                int preDelIdx=timeWheel[lastTimeIdx].lastReadySet.arry[0][1];
                timeWheel[lastTimeIdx].lastReadySet.arry[preDelIdx][1]=lastSetIdx;
                timeWheel[lastTimeIdx].lastReadySet.arry[lastSetIdx][1]=-1;
            }
        }
        // 更新哈希表
        hash[netFd][0]=idx;
        hash[netFd][1]=*isDel;
        *isDel=nextDel;
    }
    return 0;
}

